﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Sistema.Dominio;
using System.Security.Cryptography.X509Certificates;
using Sistema.NFe.Mapeamento.inutNFe;
using Sistema.NFe.Xml.Interfaces;
using System.Xml;
using Sistema.Util;

namespace Sistema.NFe.WebServiceNFe
{
    public class InutilizaNFe: WebServiceNFe
    {
        public InutilizaNFe() : base()
        {
        
        }

        public Tuple<Boolean, NFeOcorrenciaVO> Inutilizar(String justificaticaInutilizacao, X509Certificate2 certificado, String numeroInutlizacaoInicial, String numeroInutilizacaoFinal)
        {
            IXmlInutilizacao inut = new Xml.XmlFactory().GetInutcNFeReference();
            inut.NumeroInicial = numeroInutlizacaoInicial;
            inut.NumeroFinal = numeroInutilizacaoFinal;
            inut.JustificativaInutilizacao = justificaticaInutilizacao;
            inut.Versao = base.GetVersao(base._versao);
            inut.cUF = base._cUF;
            inut.TipoAmbiente = base._tipoAmbiente;
            inut.Serie = "001";

            XmlDocument DocumentoXmlInutilizacao = new XmlDocument();
            DocumentoXmlInutilizacao.LoadXml(new AssinaXML().AssinarXML(inut.Xml, "infInut", certificado).OuterXml);

            IInutilizacao inutilizacao = base.InutlizacaoNFe();
            inutilizacao.DefinirCertificado(certificado);
            inutilizacao.DefinirCabecalho(((int)base._cUF).ToString(), base.GetVersao(base._versao));
            XmlNode DocumentoXmlRetorno = inutilizacao.Inutilizar(DocumentoXmlInutilizacao);

            Mapeamento.retInutNfe.TRetInutNFe RetInut = new Serializacao().Deserialize<Mapeamento.retInutNfe.TRetInutNFe>(DocumentoXmlRetorno.OuterXml);

            if (RetInut.infInut.cStat == "102")
            {
                Dominio.NFeOcorrenciaVO dadosRetorno = new Dominio.NFeOcorrenciaVO();
                dadosRetorno.Protocolo = RetInut.infInut.nProt;
                dadosRetorno.TipoOcorrencia = TipoOcorrencia.Inutilizacao;
                dadosRetorno.XmlOcorrencia = DocumentoXmlRetorno.OuterXml;
                dadosRetorno.DataOcorrencia = RetInut.infInut.dhRecbto;

                return new Tuple<bool, NFeOcorrenciaVO>(true, dadosRetorno);
            }
            else
            {
                return new Tuple<Boolean, NFeOcorrenciaVO>(false, null);
            }

            
        }
    }
}
